home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / COMP / TEST / RAYTRACE / KUGEL_SW.M next >
Encoding:
Text File  |  1991-03-28  |  5.1 KB  |  146 lines

  1. MODULE Kugel_Sw;
  2.  
  3. (*$ R- *)
  4. (*$ E MOS *)
  5. IMPORT TOSIO;
  6.  
  7. FROM SYSTEM IMPORT ASSEMBLER;
  8.  
  9. FROM RayTrace IMPORT Ebene1schn,Ebene1weiter,Kugel1schn,Kugel1weiter,Plot_Sw,
  10.                      Plot,Unendlich,LFeld;
  11. FROM MathLib0 IMPORT sin,cos,tan,sqrt,power,pi,entier;
  12.  
  13. FROM InOut    IMPORT Write,WritePg,Read,KeyPressed;
  14.  
  15. VAR Xreso,Yreso,Halbxreso,Halbyreso,Kug1pktx,Kug1pkty,Kug1pktz,Radius,
  16.     Kug1rquad,Startpktx,Startpkty,Startpktz,Endpktx,Endpkty,Endpktz,
  17.     Alphahor,Alphaver,Blivecx,Blivecy,Blivecz,Blilen,Horivecx,Horivecy,
  18.     Horivecz,Vertvecx,Vertvecy,Vertvecz,Horilen,Horilen1,Vertlen,Vertlen1,
  19.     Ykoor,Xkoor,Vecx,Vecy,Vecz,Pktx,Pkty,Pktz,Lambdamin,Objektanzahl:LONGREAL;
  20.     Index,Farbe,Farbversch,Untersuchungsende,Weiter:INTEGER;
  21.     Lambda:LFeld;
  22.     key:CHAR;
  23.  
  24. BEGIN
  25.   WritePg;
  26.   Xreso:=320.0;
  27.   Yreso:=200.0;
  28.   Halbxreso:=Xreso/2.0;
  29.   Halbyreso:=Yreso/2.0;
  30.   (* Zahl der vorhanden Körper + Flächen *)
  31.   Objektanzahl:=2.0;
  32.   (* Daten für Kugel 1 festlegen *)
  33.   Kug1pktx:=0.0;
  34.   Kug1pkty:=0.0;
  35.   Kug1pktz:=1.2;
  36.   Radius:=1.2;
  37.   Kug1rquad:=power(Radius,2.0);
  38.   
  39.   (* Blickrichtung festlegen, die notwendigen Vektoren für weitere *)
  40.   (* Berechnungen errechnen *)
  41.   Startpktx:=4.0;
  42.   Startpkty:=-7.0;
  43.   Startpktz:=2.5;
  44.   Endpktx:=0.0;
  45.   Endpkty:=0.0;
  46.   Endpktz:=1.0;
  47.   (* horiz. Blickwinkel in Grad *)
  48.   Alphahor:=16.0;
  49.   (* in Bogenmaß umgewandeln *)
  50.   Alphahor:=Alphahor*pi/180.0;
  51.   (* vertikaler Blickwinkel entspechend der Auflösung *)
  52.   Alphaver:=(Alphahor/Xreso*Yreso)*1.05;
  53.   (* Blickvektor und darauf senkrecht stehende Seitenvektoren *)
  54.   Blivecx:=Endpktx-Startpktx;
  55.   Blivecy:=Endpkty-Startpkty;
  56.   Blivecz:=Endpktz-Startpktz;
  57.   Blilen:=sqrt(power(Blivecx,2.0)+power(Blivecy,2.0)+power(Blivecz,2.0));
  58.   (* Horizontaler Seitenvektor *)
  59.   Horivecx:=Blivecy;
  60.   Horivecy:=-Blivecx;
  61.   Horivecz:=0.0;
  62.   (* vertikaler Seitenvektor *)
  63.   Vertvecx:=Blivecz*Horivecy-Blivecy*Horivecz;
  64.   Vertvecy:=Blivecx*Horivecz-Blivecz*Horivecx;
  65.   Vertvecz:=Blivecy*Horivecx-Blivecx*Horivecy;
  66.   (* Länge des horizontalen Seitenvektor bestimmen *)
  67.   Horilen:=sqrt(power(Horivecx,2.0)+power(Horivecy,2.0));
  68.   Horilen1:=tan(Alphahor)*2.0/Xreso*Blilen;
  69.   Horivecx:=Horivecx/Horilen*Horilen1;
  70.   Horivecy:=Horivecy/Horilen*Horilen1;
  71.   (* Länge des vertikalen Seitenvektors bestimmen *)
  72.   Vertlen:=sqrt(power(Vertvecx,2.0)+power(Vertvecy,2.0)+power(Vertvecz,2.0));
  73.   Vertlen1:=tan(Alphaver)*2.0/Yreso*Blilen;
  74.   Vertvecx:=Vertvecx/Vertlen*Vertlen1;
  75.   Vertvecy:=Vertvecy/Vertlen*Vertlen1;
  76.   Vertvecz:=Vertvecz/Vertlen*Vertlen1;
  77.   
  78.   
  79.   (* Hauptprogramm: berechnet für jeden darzustellenden Punkt eine *)
  80.   (*   Blickgerade; diese wird mit allen zur Verfügung stehenden *)
  81.   (*   Flächen und Körpern geschnitten; der Körper mit der kürzesten *)
  82.   (*   positiven Entfernung zum Blickpunkt wird zum Weiterrechnen *)
  83.   (*   verwendet *)
  84.   
  85.   (* Schleifen für alle darzustellenden Punkte *)
  86.   Ykoor:=-Halbyreso;
  87.   REPEAT
  88.     Xkoor:=-Halbxreso;
  89.     REPEAT
  90.       (* momentanen Blickgerade errechnen *)
  91.       Vecx:=Blivecx+Horivecx*Xkoor+Vertvecx*Ykoor;
  92.       Vecy:=Blivecy+Horivecy*Xkoor+Vertvecy*Ykoor;
  93.       Vecz:=Blivecz+Horivecz*Xkoor+Vertvecz*Ykoor;
  94.       Pktx:=Startpktx;
  95.       Pkty:=Startpkty;
  96.       Pktz:=Startpktz;
  97.       Untersuchungsende:=0;
  98.       Farbe:=0;
  99.       Farbversch:=0;
  100.       REPEAT
  101.         (* Blickgerade mit allen Körpern schneiden *)
  102.         Index:=0;
  103.         Ebene1schn (Pktz,Vecz,Index,Lambda);
  104.         Kugel1schn (Pktx,Pkty,Pktz,Vecx,Vecy,Vecz,
  105.                     Kug1pktx,Kug1pkty,Kug1pktz,Kug1rquad,
  106.                     Lambda,Index);
  107.         (* Schnittpunkt mit kleinstem Abstand zum Blickpunkt suchen *)
  108.         Lambdamin:=Unendlich;
  109.         ASSEMBLER BREAK END;
  110.         FOR Index:=1 TO SHORT(entier(Objektanzahl)) DO END;
  111.         FOR Index:=1 TO SHORT(VAL(LONGINT,Objektanzahl)) DO END;
  112.         FOR Index:=1 TO VAL(INTEGER,Objektanzahl) DO
  113.           IF ((Lambda[Index]>0.0) AND (Lambda[Index]<Lambdamin)) THEN
  114.             Lambdamin:=Lambda[Index];
  115.             Weiter:=Index
  116.           END
  117.         END;
  118.         (* Exit wenn kein Schnittpkt. gefunden *)
  119.         IF NOT (Lambdamin=Unendlich) THEN
  120.           (* Fortsetzung der Behandlung beim Objekt in kleinster Entfernung *)
  121.           Index:=Weiter;
  122.           CASE Weiter OF
  123.                1 : Ebene1weiter (Pktx,Pkty,Vecx,Vecy,Lambda,Index,Farbe,
  124.                                  Untersuchungsende)
  125.              | 2 : Kugel1weiter (Pktx,Pkty,Pktz,Vecx,Vecy,Vecz,
  126.                                  Kug1pktx,Kug1pkty,Kug1pktz,Kug1rquad,
  127.                                  Lambda,Index,Farbversch)
  128.           END;
  129.         END
  130.       UNTIL ((Untersuchungsende=-1) OR (Farbversch>3) OR (Lambdamin=Unendlich));
  131.       (* Ausgabe des errechneten Punktes *)
  132.       IF (Farbe+Farbversch<>0) THEN
  133.         Plot_Sw (SHORT(VAL(LONGINT,Halbxreso+Xkoor)),
  134.                  SHORT(VAL(LONGINT,Halbyreso-Ykoor)),
  135.                  SHORT(VAL(LONGINT,Farbe+Farbversch)))
  136.       END;
  137.     Xkoor:=Xkoor+1.0
  138.     UNTIL (Xkoor>=Halbxreso);
  139.   Ykoor:=Ykoor+1.0;
  140.   IF KeyPressed() THEN HALT;END
  141.   UNTIL (Ykoor>=Halbyreso);
  142.   REPEAT
  143.     Read (key)
  144.   UNTIL (ORD(key)=27)
  145. END Kugel_Sw.
  146.